home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 2002 November / SGI Freeware 2002 November - Disc 3.iso / dist / fw_qt3.idb / usr / freeware / Qt / examples / demo / display.cpp.z / display.cpp
C/C++ Source or Header  |  2002-04-08  |  5KB  |  214 lines

  1. /****************************************************************************
  2. ** $Id$
  3. **
  4. ** Copyright (C) 1992-2001 Trolltech AS.  All rights reserved.
  5. **
  6. ** This file is part of an example program for Qt.  This example
  7. ** program may be used, distributed and modified without limitation.
  8. **
  9. *****************************************************************************/
  10.  
  11. #include "display.h"
  12.  
  13. #include <qpainter.h>
  14. #include <qlayout.h>
  15. #include <qtimer.h>
  16. #include <qpushbutton.h>
  17. #include <qframe.h>
  18. #include <qdial.h>
  19. #include <qlcdnumber.h>
  20. #include <qprogressbar.h>
  21. #include <qspinbox.h>
  22.  
  23. #include <math.h>
  24.  
  25. Screen::Screen(  QWidget *parent, const char *name )
  26.     : QFrame( parent, name )
  27. {
  28.     setLineWidth( FrameWidth );
  29.     setFrameStyle( Panel | Sunken );
  30.     setBackgroundMode( PaletteBase );
  31.     setFixedSize( MaxSamples+2*FrameWidth, Range+2*FrameWidth );
  32.     setPaletteBackgroundColor( black );
  33.     setPaletteForegroundColor( blue );
  34.  
  35.     memset( yval, 0, sizeof(yval) );
  36.     pos0 = 0;
  37.     t0 = 0;
  38.     step = 0;
  39. }
  40.  
  41. void Screen::animate()
  42. {
  43.     if ( step == 0 )
  44.     return;
  45.  
  46.     int t = t0;
  47.     int p = pos0;
  48.     if ( step < 0 ) {
  49.     t += MaxSamples + step;
  50.     } else {
  51.     t -= step;
  52.     p -= step;
  53.     if ( p < 0 )
  54.         p += MaxSamples;
  55.    }
  56.  
  57.     for ( int i = 0; i < QABS( step ); i++ ) {
  58.     int y = (int)((Range-FrameWidth)/2 * sin( 3.1415*(double)t/180.0 ));
  59.     yval[ p ] = y;
  60.     ++t;
  61.     t %= 360;
  62.     ++p;
  63.     p %= MaxSamples;
  64.     }
  65.     t0 -= step;
  66.     if ( t0 < 0 )
  67.     t0 += 360;
  68.     pos0 = (pos0 - step) % MaxSamples;
  69.     if ( pos0 < 0 )
  70.     pos0 += MaxSamples;
  71.  
  72.     scroll( step, 0, QRect( FrameWidth, FrameWidth, MaxSamples, Range ));
  73. }
  74.  
  75. void Screen::setStep( int s )
  76. {
  77.     step = s;
  78. }
  79.  
  80. void Screen::drawContents( QPainter *p )
  81. {
  82.     QRect r = p->hasClipping() ?
  83.           p->clipRegion().boundingRect() : contentsRect();
  84.  
  85.     int vp = ( r.left() - FrameWidth + pos0 ) % MaxSamples;
  86.     int y0 = FrameWidth + Range/2;
  87.  
  88.     for ( int x = r.left(); x <= r.right(); x++ ) {
  89.     p->drawLine( x, y0 + yval[ vp ], x, r.bottom());
  90.     ++vp;
  91.     vp %= MaxSamples;
  92.     }
  93. }
  94.  
  95. /***********************************************************************/
  96.  
  97. Curve::Curve( QWidget *parent, const char *name )
  98.     : QFrame( parent, name )
  99. {
  100.     setLineWidth( FrameWidth );
  101.     setFrameStyle( Panel | Sunken );
  102.     setBackgroundMode( PaletteBase );
  103.     setPaletteBackgroundColor(black);
  104.     setPaletteForegroundColor(red);
  105.     setFixedSize( 2*(Radius+FrameWidth), 2*(Radius+FrameWidth) );
  106.  
  107.     shift = 0;
  108.     n = 1;
  109. }
  110.  
  111. void Curve::drawContents( QPainter *p )
  112. {
  113.     p->moveTo( 100, 100 + (int)(90.0*sin( double(shift)*3.1415/180.0)));
  114.  
  115.     for ( double a = 0.0; a < 360.0; a += 1.0 ) {
  116.     double rad = 3.1415 / 180.0 * a;
  117.     double x = 103.0 + 90.0 * sin(rad);
  118.     double y = 103.0 + 90.0 * sin(n * rad + double(shift)*3.1415/180.0);
  119.     p->lineTo( int(x), int(y) );
  120.     }
  121. }
  122.  
  123. void Curve::animate()
  124. {
  125.     shift = (shift + 1) % 360;
  126.     update( FrameWidth, FrameWidth, 2*Radius, 2*Radius );
  127. }
  128.  
  129. void Curve::setFactor( int f )
  130. {
  131.     n = f;
  132. }
  133.  
  134. /***********************************************************************/
  135.  
  136. DisplayWidget::DisplayWidget( QWidget *parent, const char *name )
  137.     : QWidget( parent, name )
  138. {
  139.     timer = 0;
  140.  
  141.     QVBoxLayout *vbox = new QVBoxLayout( this, 10 );
  142.  
  143.     QHBoxLayout *hbox = new QHBoxLayout( vbox );
  144.     screen = new Screen( this );
  145.     dial = new QDial( this );
  146.     dial->setFixedSize( screen->height(), screen->height() );
  147.     dial->setNotchesVisible( TRUE );
  148.     dial->setRange( -10, 10 );
  149.     dial->setValue( 1 );
  150.     screen->setStep( dial->value() );
  151.     connect( dial, SIGNAL( valueChanged( int )),
  152.          screen, SLOT( setStep( int )));
  153.     hbox->addWidget( screen );
  154.     hbox->addWidget( dial );
  155.  
  156.     curve = new Curve( this );
  157.     spin = new QSpinBox( 1, 10, 1, this );
  158.     spin->setFixedWidth( curve->width() );
  159.     connect( spin, SIGNAL( valueChanged( int )), curve, SLOT( setFactor( int )));
  160.     spin->setValue( 2 );
  161.  
  162.     lcd = new QLCDNumber( 2, this );
  163.     lcd->setFixedSize( 100, 100 );
  164.     lcdval = 0;
  165.  
  166.     bar = new QProgressBar( 10, this );
  167.     tbar = 0;
  168.  
  169.     vbox->addWidget( curve );
  170.     vbox->addWidget( spin );
  171.     vbox->addWidget( lcd );
  172.     vbox->addWidget( bar );
  173. }
  174.  
  175. void DisplayWidget::run()
  176. {
  177.     if ( !timer ) {
  178.     timer = new QTimer( this );
  179.     connect( timer, SIGNAL( timeout() ), SLOT( tick() ) );
  180.     }
  181.  
  182.     timer->start( 5 );
  183. }
  184.  
  185. void DisplayWidget::stop()
  186. {
  187.     timer->stop();
  188. }
  189.  
  190. void DisplayWidget::tick()
  191. {
  192.     // sine
  193.     screen->animate();
  194.     // Lissajous
  195.     curve->animate();
  196.     // lcd display
  197.     lcd->display( ++lcdval % 100 );
  198.     // progress bar
  199.     bar->setProgress( 5 + (int)(5*sin( 3.1415 * (double)tbar / 180.0 )));
  200.     ++tbar;
  201.     tbar %= 360;
  202. }
  203.  
  204. void DisplayWidget::showEvent( QShowEvent * )
  205. {
  206.     run();
  207.     screen->repaint();
  208. }
  209.  
  210. void DisplayWidget::hideEvent( QHideEvent * )
  211. {
  212.     stop();
  213. }
  214.